package com.bestcem.xm.award.dao;

import com.bestcem.xm.award.entity.pojo.AwardAwardDO;
import com.bestcem.xm.award.enums.AwardStatusEnum;
import com.bestcem.xm.award.enums.AwardTypeEnum;

import java.util.Date;
import java.util.List;

/**
 * 奖励元数据dao
 *
 * @author sh.pei <sh.pei@idiaoyan.com>
 * @version v1.0
 * @date 2021/6/28 17:25
 */
public interface AwardAwardDao {

    /**
     * 根据id查询奖励数据
     *
     * @param awardId 奖励id
     * @return 奖励
     */
    AwardAwardDO findById(String awardId);

    /**
     * 开始微信优惠券，支付宝优惠券，第三方奖励
     *
     * @param awardId   奖励id
     * @param startTime 奖励开始时间
     * @return
     */
    AwardAwardDO startAward(String awardId, Date startTime);

    /**
     * 停止微信优惠券，支付宝优惠券，第三方奖励
     *
     * @param awardId  奖励id
     * @param stopTime
     * @return 奖励 过滤返回 award_id
     */
    AwardAwardDO stopAward(String awardId, Date stopTime);

    /**
     * 开始抽奖
     *
     * @param awardId   奖励id
     * @param startTime 奖励开始时间
     * @return 奖励
     */
    AwardAwardDO startDrawAward(String awardId, Date startTime);


    /**
     * 停止抽奖
     *
     * @param awardId  奖励id
     * @param stopTime
     * @return 奖励 过滤返回 award_id
     */
    AwardAwardDO stopDrawAward(String awardId, Date stopTime);

    /**
     * 开始红包
     *
     * @param awardId   奖励id
     * @param startTime 奖励开始时间
     * @return 奖励 过滤返回 award_id basic.total basic.prob activityId
     */
    AwardAwardDO startBonusAward(String awardId, Date startTime);

    /**
     * 停止红包
     *
     * @param awardId  奖励id
     * @param stopTime 奖励结束时间
     * @return 奖励 过滤返回 award_id
     */
    AwardAwardDO stopBonusAward(String awardId, Date stopTime);

    /**
     * 根据awardId和开始时间 查找未开始的红包
     *
     * @param awardId   奖励id
     * @param startTime 开始时间
     * @return 奖励
     */
    AwardAwardDO findNotStartBonus(String awardId, Date startTime);

    /**
     * 根据award_id和状态查询奖励
     *
     * @param awardId 奖励id
     * @param status  奖励状态 {@link AwardStatusEnum}
     * @return 奖励 过滤返回 tType basic.total rule
     */
    AwardAwardDO findByAwardIdAndStatus(String awardId, Integer status);

    /**
     * 根据奖励id和机构id查找奖励
     *
     * @param awardId 奖励id
     * @param orgId   机构id
     * @return 奖励
     */
    AwardAwardDO findByAwardIdAndOrgId(String awardId, String orgId);

    /**
     * 根据奖励id和机构id和奖励类型查询奖励
     *
     * @param awardId 奖励id
     * @param orgId   机构id
     * @param tType   奖励类型
     * @return 奖励
     */
    AwardAwardDO findByAwardIdAndOrgIdAndType(String awardId, String orgId, Integer tType);


    /**
     * 根据项目id 奖励状态 查询奖励
     *
     * @param orgId     奖励id
     * @param projectId   项目id
     * @param statuses 奖励状态 {@link AwardStatusEnum}
     * @return 奖励列表
     */
    List<AwardAwardDO> listAwardAwardByQdesIdAndStatus(String orgId, String projectId, List<Integer> statuses);

    /**
     * 列表查询奖励
     *
     * @param orgId     奖励id
     * @param projectId 问卷项目id
     * @param tTypes    奖励类型 {@link AwardTypeEnum}
     * @param statuses  奖励状态 {@link AwardStatusEnum}
     * @param page      分页
     * @param size      每页大小
     * @return 奖励列表
     */
    List<AwardAwardDO> listPageAwardAward(String orgId, String projectId, List<Integer> tTypes, List<Integer> statuses, Integer page, Integer size);

    /**
     * 查询奖励数量
     *
     * @param orgId     奖励id
     * @param projectId 问卷项目id
     * @param tTypes    奖励类型 {@link AwardTypeEnum}
     * @param statuses  奖励状态 {@link AwardStatusEnum}
     * @return 奖励列表
     */
    long countAwardAward(String orgId, String projectId, List<Integer> tTypes, List<Integer> statuses);

    /**
     * 保存奖励
     *
     * @param awardAwardDO 奖励
     * @return 奖励
     */
    AwardAwardDO save(AwardAwardDO awardAwardDO);

    /**
     * 根据id更新奖励
     *
     * @param awardId
     * @param awardAwardDO
     * @return
     */
    int updateByAwardId(String awardId, AwardAwardDO awardAwardDO);

    /**
     * 根据id和状态 修改奖励为新状态
     *
     * @param awardId 奖励id
     * @param status  奖励状态
     * @param update  更新内容
     * @return
     */
    int updateByIdAndStatus(String awardId, Integer status, AwardAwardDO update);

    /**
     * 根据id查询奖励
     *
     * @param awardId       奖励id
     * @param includeFields 指定返回的字段
     * @param excludeFields 指定排除的字段
     * @return 奖励数据
     */
    AwardAwardDO findById(String awardId, String[] includeFields, String excludeFields);

    /**
     * 根据id和状态和类型 查询奖励
     *
     * @param awardId       奖励id
     * @param status        奖励状态
     * @param type          状态类型
     * @param includeFields 指定返回的字段
     * @param excludeFields 指定排除的字段
     * @return
     */
    AwardAwardDO findByIdAndStatusAndType(String awardId, Integer status, Integer type, String[] includeFields, String excludeFields);

    /**
     * 删除附件
     *
     * @param attachmentId 附件id
     * @param awardId      奖励id
     * @return 奖励数据
     */
    AwardAwardDO deleteAttachmentByAttachmentIdAndAwardId(String attachmentId, String awardId);

    /**
     * 根据附件id 奖励id 查询奖励
     *
     * @param attachmentId 附件id
     * @param awardId      奖励id
     * @return 奖励数据
     */
    AwardAwardDO findByAttachmentIdAndAwardId(String attachmentId, String awardId);

    /**
     * 查询奖项等奖
     * @param awardId
     * @return
     */
    List<Integer> queryDistinctAwardLevel(String awardId, String orgId);

    /**
     * 查询奖项名称
     * @param awardId
     * @return
     */
    List<String> queryDistinctAwardName(String awardId, String orgId);
    /**
     * 领取红包后，中奖数量+1
     *
     * @param awardId
     * @return
     */
    int updateCurCountAddOneById(String awardId);

    /**
     * 查询名字是否重复
     *
     * @param name      奖励名称
     * @param projectId 项目名称
     * @param awardId   排除的奖励id
     * @return 查询到的数量
     */
    Long findDuplicateName(String name, String projectId, String awardId);

    /**
     * 删除奖励
     *
     * @param awardId
     * @return
     */
    int remove(String awardId);

    /**
     * 查询是否被使用中
     *
     * @param bandPointId 品牌积分id
     * @return 奖励
     */
    boolean existsNotDeleteAwardByPointId(String bandPointId);

    /**
     * 根据奖励id列表查询奖励列表
     * @param awardIds 奖励id列表
     * @return 奖励列表
     */
    List<AwardAwardDO> listAwardsByIds(List<String> awardIds);

    /**
     * 查询所有在指定日期前开始并在指定日期后结束的奖励的奖励,只返回主表数据
     * @param startBeforeDay 指定开始日期
     * @param endAfterDay 指定结束日期
     * @param page 分页
     * @param size 每页大小
     * @return
     */
    List<AwardAwardDO> listAwardsByStartAndEndDay(Date startBeforeDay, Date endAfterDay, Integer page, Integer size);

    /**
     * 批量结束奖励
     *
     * @param awardIds  奖励id list
     * @return 更新条数
     */
    int batchFinishAwardByIds(List<String> awardIds);

}

